<?php

declare(strict_types=1);
/**
 * This file is part of habo_new_media.
 *
 * @link     https://www.berlen.cn/
 * @contact  tech@berlen.cn
 * @license  http://gitlab.rehou.cn/habo/habo_new_media/-/blob/master/README.md
 */

namespace app\service\report;

use app\model\report\ReportRecordFieldModel;
use app\service\BaseService;

class ReportRecordDataService extends BaseService
{
    /**
     * @var array 字段类型数组
     */
    protected static array $_fieldType = [];

    /**
     * @var array 账户ID数组
     */
    protected static array $_advertiserIds = [];

    /**
     * 获取时报数据下标.
     * @param int $type 日期类型 1:今日 2:昨日
     * @param array $arr 发送时间点映射数组
     * @param int $hour 当前要发小时数据
     */
    public static function getHourDataIndex(int $type = 0, array $arr = [], int $hour = 0): int
    {
        $index = $arr[$hour] ?? -1;
        if ($index < 0) {
            return -1;
        }
        return $type == 2 ? $index : ($index + count($arr));
    }

    /**
     * 获取日报数据下标.
     * @param int $type 日期类型 1:今日 2:昨日
     */
    public static function getDayDataIndex(int $type = 0): int
    {
        return $type == 2 ? 0 : 1;
    }

    /**
     * 获取日期类型.
     * @param string $str 日期类型
     * @return false|int
     */
    public static function getDateType(string $str = '')
    {

        if (strpos($str, '(')) {
            $arr = explode('(', $str);
            $k = count($arr) - 1;
            if (strpos($arr[$k], '今日') === 0) {
                return 1;
            }
            if (strpos($arr[$k], '昨日') === 0) {
                return 2;
            }
            if (strpos($arr[$k], '汇总') === 0) {
                return 3;
            }
        }
        return false;
    }

    /**
     * 获取字段类型.
     * @param string $str 字段名称
     * @param int $mediaId 媒体类型 1：巨量 2：快手
     * @param mixed $dateType
     * @return mixed|string
     */
    public static function getFieldType(string $str = '', int $mediaId = 0, $dateType)
    {
        if (! $dateType) {
            if (strpos($str, ':00')) {
                $arr[0] = '时间';
            } else {
                $arr = explode(']', trim($str, '[='));
            }

        } else {
            $arr = explode('(', trim($str, '[='));
            if (count($arr) > 2) {
                $arr[0] = $arr[0] . '(' . $arr[1];
            }
        }
        if (! $arr[0]) {
            return '';
        }
        if (! isset(self::$_fieldType[$mediaId][$arr[0]])) {
            self::$_fieldType[$mediaId][$arr[0]] = (new ReportRecordFieldModel())->where('media_id', $mediaId)->where('field_name', $arr[0])->value('field_type');
        }
        return self::$_fieldType[$mediaId][$arr[0]];
    }

    /**
     * 获取所以字段.
     * @param int $mediaId 媒体类型 1：巨量 2：快手
     * @return mixed
     */
    public static function getFields(int $mediaId = 0)
    {
        return self::$_fieldType[$mediaId];
    }

    /**
     * 获取账户ID.
     * @param string $str 账户字段
     * @return int|string
     */
    public static function getAdvertiserIds(string $str = '')
    {
        $arr = explode('&', $str);
        if (! $arr[1]) {
            return '';
        }
        return intval($arr[1]);
    }

    /**
     * 数据计算处理.
     * @param array $data 数据
     * @param array $field 字段
     * @return int|string
     */
    public static function getFieldValue(array $data = [], array $field = [])
    {
        $value = '';
        if (! empty($field['default'])) {
            $item = explode('|', $field['default']);
            if (empty($data[$item[0]])) {
                return $item[1] ?? $value;
            }
        }
        if (! empty($field['args'])) {
            $args = [];
            foreach ($field['args'] as $k => $v) {
                if ($k == 2) {
                    $args[$k] = $v;
                }
                if ($k < 2) {
                    $item = explode('|', $v);
                    $args[$k] = $item[0];
                    if (! empty($item[1])) {
                        $args[$k] = call_user_func($item[1], $item[0]);
                    }
                }
            }
            if ($args) {
                $value = self::bc_div($data[$args[0]], $data[$args[1]], $args[2]);
            }
        }
        if (! empty($field['callback'])) {
            $value = call_user_func([new self(), $field['callback']], $value);
        }
        return $value;
    }

    // 计算方式

    /**
     * 数据计算处理.
     * @param mixed $molecule
     * @param mixed $denominator
     * @param mixed $point
     * @return int|string
     */
    public static function bc_div($molecule, $denominator, $point): float
    {
        if ($denominator == 0) {
            return 0;
        }
        return round($molecule / $denominator, $point);
    }

    // 返回样式

    /**
     * 百分比-保留两位.
     * @param mixed $val
     * @return int|string
     */
    public static function getPercentWithTwo($val): string
    {
        if ($val == 0) {
            return '0%';
        }
        return round(floatval($val) * 100, 2) . '%';
    }

    /**
     * 百分比-保留三位.
     * @param mixed $val
     * @return int|string
     */
    public static function getPercentWithThree($val): string
    {
        if ($val == 0) {
            return '0%';
        }
        return round(floatval($val) * 100, 3) . '%';
    }

    /**
     * 浮点-保留三位.
     * @param mixed $val 参数
     * @return int|string
     */
    public static function getPercentFloating($val): float
    {
        if ($val == 0) {
            return 0;
        }
        return round(floatval($val), 3);
    }

    /**
     * 千次数据-保留三位.
     * @param mixed $val 参数
     * @return int|string
     */
    public static function getPercentFloatingKilo($val): float
    {
        if ($val == 0) {
            return 0;
        }
        return round(floatval($val) * 1000, 3);
    }
}
